package com.punch.course.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.punch.common.dto.course.AdminEditClassDTO;
import com.punch.common.dto.course.ApplyCourseDTO;
import com.punch.common.dto.course.ClassDTO;
import com.punch.common.dto.course.ClassSaveOrUpdateDTO;
import com.punch.common.page.PageInfo;
import com.punch.common.vo.course.classes.ClassPageVO;
import com.punch.common.vo.course.classes.ClassVO;
import com.punch.course.model.CourseClass;
import com.punch.course.query.ClassQueryInfo;


/**
 * <p>
 * 课程班级表 服务类
 * </p>
 *
 * @author wjj
 * @since 2020-12-01
 */
public interface CourseClassService extends IService<CourseClass> {

    /**
     * 条件分页查询班级列表
     *
     * @param classQueryInfo 查询条件
     * @return PageInfo<ClassPageVO>
     */
    PageInfo<ClassPageVO> listClass(ClassQueryInfo classQueryInfo);


    /**
     * 查询班级详情
     *
     * @param classId 课程班级id
     * @return ClassVO
     */
    ClassVO getClasses(Long classId);

    /**
     * 新增课程班级
     *
     * @param classSaveOrUpdateDTO 班级新增/修改表单
     * @return 主键id
     */
    Long saveClass(ClassSaveOrUpdateDTO classSaveOrUpdateDTO);

    /**
     * 修改未发布班级信息
     *
     * @param classId              班级id
     * @param classSaveOrUpdateDTO 班级新增/修改表单
     * @return 主键id
     */
    void updateUnReleaseClass(Long classId, ClassSaveOrUpdateDTO classSaveOrUpdateDTO);

    /**
     * 删除班级信息
     *
     * @param classId 班级id
     * @return 删除提示消息
     */
    void deleteClass(Long classId);

    /**
     * 机构申请开班
     *
     * @param applyCourseDTO 开班表单
     */
    void applySchoolCourse(ApplyCourseDTO applyCourseDTO);

    /**
     * 机构取消申请开班
     *
     * @param classId 班级id
     */
    void applySchoolCourseCancel(Long classId);

    /**
     * 发布班级
     *
     * @param classId  班级id
     * @param classDTO 班级发布
     */
    void releaseClass(Long classId, ClassDTO classDTO);

    /**
     * 取消报名
     *
     * @param classId 班级id
     */
    void signUpCancel(Long classId);

    /**
     * 拒绝申请
     *
     * @param classId 班级id
     */
    void refuseApply(Long classId);

    /**
     * 运营修改班级
     *
     * @param classId           班级id
     * @param adminEditClassDTO 运营修改班级dto
     */
    void adminEditClass(Long classId, AdminEditClassDTO adminEditClassDTO);


    /**
     * 报名修改班级课程的报名人数
     *
     * @param courseClassId 班级课程id
     */
    Boolean updateSignUpNumber(Long courseClassId);
}
